#include <thread> // C++
#include <unistd.h>
#include<iostream>
#include<cerrno>
#include<cstring>
#include<string>
using namespace std;

__thread int g_val = 100;// 属于初始化数据
void *threadrun1(void *args)
{
    std::string name = static_cast<const char *>(args);
    while(true)
    {
        sleep(1);
        printf("%s, g_val: %lu, &g_val: %p\n", name.c_str(), g_val, &g_val);
        g_val--;
    }

    return nullptr;
}

void *threadrun2(void *args)
{
    std::string name = static_cast<const char *>(args);
    while(true)
    {
        sleep(1);
        printf("%s, g_val: %lu, &g_val: %p\n", name.c_str(), g_val, &g_val);
        g_val--;
    }

    return nullptr;
}

int main()
{
    pthread_t tid1;
    pthread_create(&tid1, nullptr, threadrun1, (void *)"thread 1");

    pthread_t tid2;
    pthread_create(&tid2, nullptr, threadrun2, (void *)"thread 2");

    pthread_join(tid1, nullptr);
    pthread_join(tid2, nullptr);

    
    int cnt = 5;
    while(true)
    {
        if(!(cnt--)) break;
        //cout << " I am a main thread ... " << endl;
        sleep(1);
    }
    return 0;
}




















// // 线程是可以分离的: 默认线程是joinable的。
// // 如果我们main thread不关心新线程的执行信息，我们可以将新线程设置为分离状态:
// // 你是如何理解线程分离的呢？底层依旧属于同一个进程！只是不需要等待了
// // 一般都希望mainthread 是最后一个退出的，无论是否是join、detach


// std::string ToHex(pthread_t tid)
// {
//     char id[64];
//     snprintf(id, sizeof(id), "0x%lx", tid);
//     return id;
// }


// void *threadrun(void *args)
// {
//     std::string name = static_cast<const char *>(args);

//     int cnt = 5;
//     while(true)
//     {
//         //if(!(cnt--)) break;
//         //cout << "I am a new thread ..."<< endl;
//         sleep(1);
//     }

//     return nullptr;
// }


// int main()
// {
//     pthread_t tid1;
//     pthread_create(&tid1, nullptr, threadrun, (void *)"thread 1");

//     pthread_t tid2;
//     pthread_create(&tid2, nullptr, threadrun, (void *)"thread 2");

//     cout << "new tid: " << tid << ", hex tid: " << ToHex(tid) << endl;
//     cout << "main tid: " << pthread_self() << ", hex tid: " << ToHex(pthread_self()) << endl;
    
//     int cnt = 5;
//     while(true)
//     {
//         if(!(cnt--)) break;
//         //cout << " I am a main thread ... " << endl;
//         sleep(1);
//     }
//     return 0;
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr, threadrun, (void *)"thread 1");
//     pthread_detach(tid);
    
//     cout << "main thread wait block" << endl;
//     int n = pthread_join(tid, nullptr);
//     cout << "main thread wait return: " << n << ": " << strerror(n) << std::endl;

//     return 0;
// }





// void threadrun(int num)
// {
//     while(num)
//     {
//         std::cout << "I am a thread, num: " << num << std::endl;
//         sleep(1);
//     }
// }

// int main()
// {
//     std::thread t1(threadrun, 10);
//     std::thread t2(threadrun, 10);
//     std::thread t3(threadrun, 10);
//     std::thread t4(threadrun, 10);
//     std::thread t5(threadrun, 10);

//     while(true)
//     {
//         std::cout << "I am a main thread "<< std::endl;
//         sleep(1);
//     }

//     t1.join();
//     t2.join();
//     t3.join();
//     t4.join();
//     t5.join();

//     return 0;
// }